package cn.itsource.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class RequestTimeFilter implements GatewayFilter, Ordered {


    @Override
    /**
     * exchange 请求的上下文
     * chain 过滤器链
     */
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("==================请求进入过滤器 GatewayFilter=============================");
        // 过滤的核心方法
//        1. 请求被过滤器拦截到时，记录当前时间
        Long startTime = System.currentTimeMillis();
        // 把请求的时机，保存到请求的参数中
        exchange.getAttributes().put("startTime", startTime);

        return chain.filter(exchange).then(Mono.fromRunnable(new Runnable() {
            // chain.filter(exchange) 调用过滤器链 的下一个 过滤器
            // .then 所有请求执行完成，在执行参数Mono 中的操作
            @Override
            public void run() {
                // 2. 请求执行，执行完成之后，记录完成时间
                // 3. 两个时间一减就是请求的耗时`
                Long startTime1 = (Long) exchange.getAttribute("startTime");
                Long endTime = System.currentTimeMillis();
                String rawPath = exchange.getRequest().getURI().getRawPath();
                System.out.println(rawPath +"请求耗时：" + (endTime - startTime1));
            }
        }));
    }

    @Override
    //返回值越低，优先级越高
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}
